#ifndef GEOMETRY_H
#define GEOMETRY_H
#include "Vector.h"
#include "Color.h"
#include "Ray.h"
#include "Texture.h"
#include <string>
#include <vector>
class Geometry{
	public:
		virtual ~Geometry(){}
		std::string name;
		Vector position;
		Color color;
		Texture texture;
		double ambienceConstant;
		double diffusionConstant;
		double specularConstant;
		double reflectionConstant;
		double specularExponent;
		double transparency;
		double refractionIndex;
		/* intersection() takes a ray and returns a list of values of t for which 
		 * ray.initialPoint + ray.direction * t is an intersection between this object
		 * and the ray. The values must be positive and sorted in ascending order.*/
		virtual std::vector<double> intersection(Ray& ray) = 0;

		/* contains() returns true if the given point is inside this object, and false
		 * otherwise. For objects that are not closed (planes, triangles, etc.), it
		 * should (probably) return whether the point is behind the object.*/
		virtual bool contains(Vector& point) = 0;

		/* normal() returns a vector normal to this object at the given point. */
		virtual Vector normal(Vector& surfacePoint) = 0;
		
		/* getColor() returns either the real color or the texture mapping */
		virtual Color getColor(Vector& position) = 0;
};
#endif

